In [41]:
    
# Vamos a definir la distancia de Hamming
# Para ello definimos primero lo que significa distancia entre dos palabras o elementos
def dv(x,y):
    distancia = 0
    for i in range(len(x)):
        if x[i] != y[i]:
            distancia = distancia + 1
    return distancia
    
In [42]:
    
# También podemos definir la distancia entre los elementos de un código C.
# Esta versión no aprovecha que la distancia es simétrica
def dc(C):
    distancias = set([dv(x,y) for x in C for y in C if x!=y])
    return min(distancias)
    
In [43]:
    
# La siguiente versión aprovecha que la distancia es simétrica
def dc_simetrica(C):
    distancia_minima = oo
    for i in range(len(C)):
        for j in range(i+1,len(C)):
            distancia = dv(C[i],C[j])
            if dv(C[i],C[j])<distancia_minima:
                distancia_minima=distancia
    return(distancia_minima)
    
In [44]:
    
a = vector([0,0,0])
b = vector([1,1,1])
C3 = (a,b)
    
In [45]:
    
print(dv(a,b))
    
    
In [46]:
    
dv(vector([0,0,0]),vector([0,1,1]))
    
    Out[46]:
In [47]:
    
# Definimos el código C
C0 = (vector([0,0,0]),vector([0,1,1]),vector([1,0,1]),vector([1,1,0]))
print(dc_simetrica(C0))
    
    
No tengo claro que dc calcule la distancia mínima
In [48]:
    
C1 = (vector([0,0,0]),vector([0,1,1]),vector([1,0,1]),vector([1,1,0]),vector([1,1,1]),vector([0,0,1]))
print(dc_simetrica(C1))
    
    
In [49]:
    
C2 = (vector([0,0,0]),vector([0,1,1]),vector([1,0,1]),vector([1,1,0]),vector([1,1,1]))
print(dc_simetrica(C2))
    
    
In [50]:
    
# Numero de errores (k) capaz de detectar nuestro código
k3 = dc(C3)-1
k0 = dc(C0)-1
print("El código C3 definido podrá detectar un máximo de " + str(k3) + " errores.")
print("El código C0 definido podrá detectar un máximo de " + str(k0) + " errores.")
    
    
In [0]: